package com.ict.ms.trackPlayBack.facade.api;

import com.ict.ms.trackPlayBack.facade.api.IHistoryAnalysisService;
import com.ict.ms.trackPlayBack.facade.dto.AreaParams;
import com.ict.ms.trackPlayBack.facade.dto.Circular;
import com.ict.ms.trackPlayBack.facade.dto.CircularSector;
import com.ict.ms.trackPlayBack.facade.dto.ResultObjWithCount;
import com.ict.ms.trackPlayBack.facade.model.Analysis;
import com.ict.ms.trackPlayBack.facade.model.ListShipDataReturn;
import com.ict.ms.trackPlayBack.facade.model.MmsiIOCountWithStaticInfo;
import com.ict.ms.trackPlayBack.facade.model.ShipDataReturn;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public interface IHistoryAnalysisService {


    /**
     * 区域流量分析
     * @param areaParams
     * @return
     */
    public ResultObjWithCount getAnalysis(AreaParams areaParams,int mode);

    /**
     * 扇（环）形区域态势回放
     * @param mode
     * @param hisAreaParams
     * @param circularSector
     * @return
     */
    public ResultObjWithCount analysisSector(int mode,AreaParams hisAreaParams,CircularSector circularSector);

    /**
     * 圆形区域流量分析
     * @param mode
     * @param areaParams
     * @param circular
     * @return
     */
    public ResultObjWithCount getAnalysisCirCular(int mode,AreaParams areaParams, Circular circular);



    /**
     * 多边形区域流量分析
     * @param mode
     * @param areaParams
     * @param point_x_list
     * @param point_y_list
     * @return
     */
    public ResultObjWithCount getAnalysisPolygons(int mode,AreaParams areaParams, ArrayList<Double> point_x_list,ArrayList<Double> point_y_list);

    /**
     * 对不同国家指定类型的船舶进出进行列表计算
     * @param mapDst 不同国家，不同船舶类型船舶驶入map
     * @param mapSrc 不同国家，不同船舶类型船舶驶出map
     * @param key 国家作为key，有则更新，无则新建并且更新
     * @param mmsiIOCountWithStaticInfo 船舶的进出次数对象，包括该船舶的静态信息
     */
    public void shipIOAnalysis(Map<String,ShipDataReturn> mapDst,Map<String,ShipDataReturn> mapSrc,String key,MmsiIOCountWithStaticInfo mmsiIOCountWithStaticInfo);


    /**
     * 对每个目标轨迹列表进行进出量分析计算（矩形）
     * @param analysisList 目标轨迹列表
     * @param areaParams 区域参数对象
     * @return 返回每艘船的进出次数,包含该搜船的国家、类型、MMSI等静态信息
     */
    public MmsiIOCountWithStaticInfo IOAnalysis(List<Analysis> analysisList, AreaParams areaParams);

    /**
     * 对每个目标轨迹列表进行进出量分析计算（圆形）
     * @param analysisList
     * @param circular
     * @return
     */
    public MmsiIOCountWithStaticInfo IOAnalysisCirCular(List<Analysis> analysisList,Circular circular);
    /**
     * 对每个目标轨迹列表进行进出量分析计算（扇形）
     * @param analysisList
     * @param p
     * @return
     */
    public MmsiIOCountWithStaticInfo IOAnalysisSector(List<Analysis> analysisList, com.ict.ms.trackPlayBack.facade.common.CircularSectorWithLongitudeCrossed180 p);

    /**
     * 对每个目标轨迹列表进行进出量分析计算（扇环形）
     * @param analysisList
     * @param p
     * @return
     */
    public MmsiIOCountWithStaticInfo IOAnalysisSectorAnnular(List<Analysis> analysisList, com.ict.ms.trackPlayBack.facade.common.AnnularSectorWithLongitudeCrossed180 p) ;
    /**
     * 对每个目标轨迹列表进行进出量分析计算（多边形）
     * @param analysisList
     * @param p
     * @return
     */
    public MmsiIOCountWithStaticInfo IOAnalysisPolygons(List<Analysis> analysisList, com.ict.ms.trackPlayBack.facade.common.PolygonWithLongitudeCrossed180 p);
    /**
     * 对目标进行目标列表分类，一个目标一个List
     * @param map 存储各个目标轨迹列表的Map，以目标ID为Key，目标列表为Value
     * @param key 目标id
     * @param analysis 目标对象信息，包括船舶经度、纬度、船舶类型，国别、ID号等
     */
    public void putAddAnalysis(Map<String,ArrayList<Analysis>> map, String key, Analysis analysis);

    public void putOrigAddAnalysis(Map<String,ArrayList<Analysis>> map, String key, Analysis analysis);

    /**
     * AIS船舶类型需要经过处理才好在程序里面进行判断
     *货船 ：70-79
     油轮： 80-89
     拖船 ：31-32
     拖轮 ：52
     搜救船 ：51
     客船 ：60-69
     渔船：30
     军事船：34
     * @param shipType
     * @return
     */
    public int DealAisShipType(int shipType);
}